#!/bin/bash

# 加载配置文件
source config.ini

# 服务器的 Redfish API 基础 URL
REDFISH_BASE_URL="https://${REDISH_IP}/redfish/v1"
# 系统 ID，根据实际情况修改
SYSTEM_ID="System.Embedded.1"
# BIOS 设置的 URL
BIOS_URL="${REDFISH_BASE_URL}/Systems/1/Bios"
# 读取 JSON 文件内容
BIOS_ATTRIBUTES=$(cat bios_settings.json)

# 最大重试次数
MAX_RETRIES=3
RETRY_COUNT=0

# 首次尝试不携带 ETag
ETAG=""

# 根据 API 文档确定支持的 HTTP 方法，这里假设为 PATCH
HTTP_METHOD="PATCH"

while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
    if [ -n "$ETAG" ]; then
        # 如果有 ETag，设置 If-Match 请求头
        HEADER=" -H \"If-Match: $ETAG\""
    else
        HEADER=""
    fi

    # 构建并执行 curl 命令
    CURL_COMMAND="curl -k -s -D /tmp/response_headers -X $HTTP_METHOD -H \"Content-Type: application/json\" $HEADER -u \"${USERNAME}:${PASSWORD}\" -d '$BIOS_ATTRIBUTES' \"${BIOS_URL}\""
    RESPONSE=$(eval $CURL_COMMAND)

    # 检查响应状态码
    HTTP_CODE=$(grep -oP '(?<=HTTP/1.1 )\d+' /tmp/response_headers)

    case $HTTP_CODE in
        200|204)
            echo "BIOS 设置更新成功。"
            exit 0
            ;;
        412)
            echo "ETag 不匹配，第 $((RETRY_COUNT + 1)) 次重试..."
            # 从响应头中提取新的 ETag
            ETAG=$(grep -i "ETag:" /tmp/response_headers | awk '{print $2}' | tr -d '\r')
            RETRY_COUNT=$((RETRY_COUNT + 1))
            ;;
        400)
            echo "请求体存在问题，请检查 JSON 文件内容和数据格式。响应内容：$RESPONSE"
            exit 1
            ;;
        401)
            echo "身份验证失败，请检查用户名和密码，或联系管理员解锁账户。响应内容：$RESPONSE"
            exit 1
            ;;
        404)
            echo "未找到指定资源，请检查 URI 路径、API 版本和服务器配置。响应内容：$RESPONSE"
            # 尝试获取正确的系统 ID
            SYSTEM_COLLECTION_URL="${REDFISH_BASE_URL}/Systems"
            SYSTEM_RESPONSE=$(curl -k -s -u "${USERNAME}:${PASSWORD}" "$SYSTEM_COLLECTION_URL")
            NEW_SYSTEM_ID=$(echo "$SYSTEM_RESPONSE" | jq -r '.Members[0]["@odata.id"]' | awk -F '/' '{print $NF}')
            if [ -n "$NEW_SYSTEM_ID" ]; then
                SYSTEM_ID="$NEW_SYSTEM_ID"
                BIOS_URL="${REDFISH_BASE_URL}/Systems/${SYSTEM_ID}/Bios"
                echo "尝试使用新的系统 ID: $SYSTEM_ID 重新请求..."
                RETRY_COUNT=$((RETRY_COUNT - 1))  # 重试本次请求
            else
                exit 1
            fi
            ;;
        405)
            echo "使用的 HTTP 方法不被允许，请检查 API 文档并修改脚本中的 HTTP_METHOD 变量。响应内容：$RESPONSE"
            exit 1
            ;;
        *)
            echo "请求失败，HTTP 状态码：$HTTP_CODE。响应内容：$RESPONSE"
            exit 1
            ;;
    esac
done

echo "达到最大重试次数，更新失败。请检查账号权限或服务器配置。"
